# -*- coding:utf-8 -*-

import datetime
from flask import config, current_app, request, jsonify, g, json
from iHome.utils.response_code import RET
from iHome.models import House, Order
from . import api
from iHome import db
from iHome.utils.common import login_required
from iHome import redis_store

@api.route("/orders/<int:order_id>/comment", methods=['PUT'])
@login_required
def comment_order(order_id):
    """
    给订单添加评价
    １．获取到前端传过来的参数
    ２．通过id查询到指定的订单
    ３．给该订单设置评价／将该订单的状态设置为完成
    ４．提交到数据库
    ５．返回结果
    :param order_id:
    :return:
    """
    # １．获取到前端传过来的参数
    comment = request.json.get("comment")
    if not comment:
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    # ２．通过id查询到指定的订单
    try:
        order = Order.query.filter(Order.id == order_id, Order.status == "WAIT_COMMENT").first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据查询失败")
    if not order:
        return jsonify(errno=RET.NODATA, errmsg="订单不存在")

    # ３．给该订单设置评价／将该订单的状态设置为完成
    order.comment = comment
    order.status = "COMPLETE"

    # ４．提交到数据库
    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")

    # TODO: 删除指定房屋的redis缓存
    try:
        house_id = order.house_id
        redis_store.delete("house_deatil_%d"%house_id)
    except Exception as e:
        current_app.logger.error(e)
    # ５．返回结果
    return jsonify(errno=RET.OK, errmsg="OK")


@api.route("/orders/<int:order_id>/status", methods=["PUT"])
@login_required
def change_order_status(order_id):
    """更改订单的状态：接单
    1.取到当前的订单号
    ２．取到订单号所对应的订单模型
    ３．校验该订单的房东是否是登录用户
    ４．修改订单状态：从待接单到待评价
    ５．返回
    """
    # 取到当前登录的用户的id
    user_id = g.user_id
    data_json = request.json
    action = data_json.get("action")
    # 取到当前时接单还是拒单的事件
    # action = request.json.get("action")
    # 校验参数
    if not action:
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    # action :　接单　accept 拒单 reject
    if action not in("accept", "reject"):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    # 查询订单
    try:
        order = Order.query.filter(Order.id == order_id, Order.status == "WAIT_ACCEPT").first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询订单失败")

    if not order:
        return jsonify(errno=RET.NODATA, errmsg="订单不存在")

    # 3.校验该订单的房东是否时登录的用户
    if user_id != order.house.user_id:
        return jsonify(errno=RET.ROLEERR, errmsg="数据错误")
    if "accept" == action:
        # 修改订单状态
        order.status = "WAIT_COMMENT"
    elif "reject" == action:
        order.status = "REJECTED"
        # 获取拒单原因
        reason = request.json.get("reason")
        if not reason:
            return jsonify(errno=RET.PARAMERR, errmsg="请填写拒单原因")
        # 保存拒单原因
        order.comment = reason

    # 保存到数据库
    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存订单失败")
    return jsonify(errno=RET.OK, errmsg="ok")


@api.route("/user/orders")
@login_required
def get_user_orders():
    """查询当前用户所下的所下的订单
    1.获取参数
    """
    user_id = g.user_id
    role = request.args.get("role")
    if not role:
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    if role not in("custom", "landlord"):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    try:
        if "custom" == role:
            # 查询房客的订单：从订单列表中查询user_id为登录用户的id就可以了
            orders = Order.query.filter(Order.user_id == user_id).order_by(Order.create_time.desc()).all()
        elif "landlord" == role:
            # 查询房东的订单，要先查询出房东的所有房屋id,再去订单表中查询指定的房屋id的订单
            houses = House.query.filter(House.user_id == user_id).all()
            # 获取自己的房屋的所有id
            houses_id = [house.id for house in houses]
            orders = Order.query.filter(Order.house_id.in_(houses_id)).order_by(Order.create_time.desc()).all()

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据失败")
    order_dict = []
    for order in orders:
        order_dict.append(order.to_dict())
    return jsonify(errno=RET.OK, errmsg="OK", data={"orders": order_dict})


@api.route("/orders", methods=["POST"])
@login_required
def add_order():
    """1.获取参数：3个(入住日期，离开日期，房屋的id)
    2.判断参数是否符合规则
    3.判断是否存在该房屋
    4.判断该房屋指定的时间是否有订单(冲突)、
    5.创建订单模型
    6.保存订单
    7.返回结果
    """
    # 1.获取参数：3个(入住日期，离开日期，房屋的id)
    data_dict = request.json
    start_date_str = data_dict.get("start_date")
    end_date_str = data_dict.get("end_date")
    house_id = data_dict.get("hid")

    # 2判断参数是否有值
    if not all([start_date_str, end_date_str, house_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    try:
        start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d")
        end_date = datetime.datetime.strptime(end_date_str, "%Y-%m-%d")
        assert start_date < end_date, Exception("开始时间必须小于结束时间")
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    # 3.判断是否存在该房屋
    try:
        house = House.query.get(house_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据错误")

    if not house:
        return jsonify(errno=RET.NODATA, errmsg="该房屋不存在")

    # 4.该房屋指定时间是否有订单
    # order_count = 0
    try:
        filters = [Order.house_id == house_id, Order.begin_date < end_date, Order.end_date > start_date]
        # 查询冲突订单的数量
        order_count = Order.query.filter(*filters).count()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据错误")
    # 如果冲突数量大于０
    if order_count > 0:
        # 已经存在相同时间冲突的订单
        return jsonify(errno=RET.DATAERR, errmsg="当前房屋已被预定")

    # 5.创建订单模型
    days = (end_date - start_date).days
    order = Order()
    order.user_id = g.user_id
    order.house_id = house_id
    order.begin_date = start_date
    order.end_date = end_date
    order.days = days
    order.house_price = house.price
    order.amount = days * house.price
    # 房屋的订单数量+1
    house.order_count += 1

    # 保存到数据库
    try:
        db.session.add(order)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")
    # 7.返回结果
    return jsonify(errno=RET.OK, errmsg="OK")
